package hash;


public class c1_初始化容量 {

	/**
	 * 临界范围，也就是最大的Map集合
	 */
	static final int MAXIMUM_CAPACITY = 1 << 30;

	public static void main(String[] args) {
		System.out.println(tableSizeFor(310));
	}

	/**
	 * 此函数是为了将二进制的所有位置上都填上1，然后再加1，就是一个2的幂数
	 * 真实目的是为了确保所有map初始化时容量均为2的n次幂
	 *
	 * |（位或）：两个二进制数，只要两个数位置上有1，则该位置是1，如果两个都是0，则为0
	 *
	 * >>>（无符号右移）：正数右移，高位用0补，负数右移，高位用1补，当负数使用无符号右移时，
	 * 用0进行部位(自然而然的，就由负数变成了正数了)
	 *
	 * @param cap
	 * @return
	 */
	static final int tableSizeFor(int cap) {
		int n = cap - 1;
		n |= n >>> 1;
		n |= n >>> 2;
		n |= n >>> 4;
		n |= n >>> 8;
		n |= n >>> 16;
		return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
	}

}
